package es.ise.core.mbg.plugins.constraints;

import java.util.List;

import org.mybatis.generator.api.IntrospectedColumn;
import org.mybatis.generator.api.IntrospectedTable;
import org.mybatis.generator.api.PluginAdapter;
import org.mybatis.generator.api.dom.java.Field;
import org.mybatis.generator.api.dom.java.FullyQualifiedJavaType;
import org.mybatis.generator.api.dom.java.TopLevelClass;

/**
 * Este plugin añade a las columnas de tipo <code>VARCHAR2(x)</code> una validación
 * que comprueba que la longitud de la cadena no sea mayor que <code>x</code>.
 * 
 * Al igual que con {@link NullConstraintPlugin}, las anotaciones de validación
 * carecen de sentido si la tabla no tiene claves primarias.
 * 
 * @author Paco
 */
public class MaxLengthConstraintPlugin extends PluginAdapter
{

	@Override
	public boolean validate(List<String> warnings)
	{
		// no validations needed
		return true;
	}

	@Override
	public boolean modelFieldGenerated(Field field, TopLevelClass clazz, IntrospectedColumn column, IntrospectedTable table, ModelClassType modelClassType)
	{
		if(table.hasPrimaryKeyColumns()) // si tiene clave primarias
		{
			if(column.isJdbcCharacterColumn() || column.isStringColumn()) // si la columna es una cadena
			{
				if(column.getLength() > 0) // y si tiene restricción de longitud
				{
					// añade la restricción @Size
					clazz.addImportedType(new FullyQualifiedJavaType("javax.validation.constraints.Size"));
					field.addAnnotation(String.format("@Size(max=%d)", column.getLength()));
				}
			}
		}
		return true;
	}

}
